import { reactive } from "vue";
import type { FormRules } from "element-plus";
import { http } from "@/utils/http";
import { changeHttpLink } from "@/utils/test";

/**
 * 获取表单验证规则
 * @param excludeId 排除的ID（修改表单时传入，用于跳过对当前编辑项的唯一性校验）
 */
export function getFormRules(excludeId?: number | string) {
  return reactive<FormRules>({
    name: [
      { required: true, message: "频道名称为必填项", trigger: "blur" },
      {
        validator: (rule, value, callback) => {
          if (!value) {
            callback();
            return;
          }
          // 使用IIFE包装异步代码
          (async () => {
            try {
              const params = {
                name: value
              };

              // 如果提供了excludeId，添加到参数中，用于跳过对当前编辑项的唯一性校验
              if (excludeId) {
                (
                  params as { name: string; excludeId?: number | string }
                ).excludeId = excludeId;
              }

              const res = await http.get(
                changeHttpLink("/api/Channel/check-name-unique"),
                { params }
              );
              console.log("params", params);
              console.log("res", res);

              // 添加类型断言以解决TypeScript类型检查问题
              const typedRes = res as {
                Success: boolean;
                Data?: boolean;
              };
              if (typedRes.Success && typedRes.Data) {
                // 检查通过
                callback();
              } else {
                callback(new Error("频道名称已存在"));
              }
            } catch (error) {
              console.error("唯一性检查失败", error);
              callback(new Error("频道名称唯一性检查失败，请稍后重试"));
            }
          })();
        },
        trigger: "blur"
      }
    ],
    status: [{ required: true, message: "请选择状态", trigger: "change" }],
    // 添加频道号唯一性验证规则
    no: [
      { required: true, message: "频道号为必填项", trigger: "blur" },
      {
        validator: (rule, value, callback) => {
          if (!value) {
            callback();
            return;
          }

          // 使用IIFE包装异步代码
          (async () => {
            try {
              // 构建请求参数
              const params: { name: string; excludedId?: number } = {
                name: value
              };

              // 如果提供了excludeId，添加到参数中，用于跳过对当前编辑项的唯一性校验
              if (excludeId) {
                params.excludedId = Number(excludeId);
              }

              // 发送请求检查频道号是否存在
              const res = await http.get(
                changeHttpLink("/api/Channel/check-no-unique"),
                { params }
              );

              // 添加类型断言以解决TypeScript类型检查问题
              const typedRes = res as {
                Success: boolean;
                Data?: boolean;
              };

              // 修复条件判断逻辑和错误消息
              if (typedRes.Success && !typedRes.Data) {
                callback(new Error("频道号已存在"));
              } else if (!typedRes.Success) {
                callback(new Error("验证频道号失败，请重试"));
              } else {
                callback();
              }
            } catch (error) {
              console.error(error);
              callback(new Error("验证频道号失败，请重试"));
            }
          })();
        },
        trigger: "blur"
      }
    ]
  });
}

// 保留原有的formRules以便向后兼容
// 在实际应用中，建议更新所有使用formRules的地方使用getFormRules函数
export const formRules = getFormRules();
